package com.css.ztb.config;

import com.css.ztb.interceptors.DataSourceInterceptor;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @project  cloudplatform
 * @package com.css.ztb.qxgl.config
 * @file OracleDataSource.java 创建时间:2019年6月19日下午5:19:11
 * @title 标题（要求能简洁地表达出类的功能和职责）
 * @description 描述（简要描述类的职责、实现方式、使用注意事项等）
 * @copyright Copyright (c) 2019 中国软件与技术服务股份有限公司
 * @company 中国软件与技术服务股份有限公司
 * @module 模块: 模块名称
 * @author   史雪涛
 * @reviewer 审核人
 * @version 1.0
 * @history 修订历史（历次修订内容、修订人、修订时间等）
 *
 */
@Configuration
@MapperScan(basePackages = "com.css.ztb.**.mapper", sqlSessionFactoryRef = "oracleSqlSessionFactory")
public class OracleDataSource {

    @Bean(name = "dynamicDataSource")
    public DynamicDataSource dynamicDataSource(@Qualifier("primaryDataSource") DataSource primaryDataSource, @Qualifier("slaveDataSource") DataSource slaveDataSource) {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        Map<Object, Object> map = new HashMap<>();
        map.put(DataSourceHolder.MASTER_DB, primaryDataSource);
        map.put(DataSourceHolder.SLAVE_DB, slaveDataSource);
        dynamicDataSource.setTargetDataSources(map);
        return dynamicDataSource;
    }

    /**
     * @name 向SessionFactory注入oracle数据源
     * @description 向SessionFactory注入oracle数据源
     * @time 创建时间:2018年12月16日上午9:51:19
     * @param dynamicDataSource dataSource
     * @return SqlSessionFactory
     * @throws Exception
     * @history 修订历史（历次修订内容、修订人、修订时间等）
     */
    @Bean(name = "oracleSqlSessionFactory")
    public SqlSessionFactory oracleSqlSessionFactory(@Qualifier("dynamicDataSource") DynamicDataSource dynamicDataSource) throws Exception {
        final SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dynamicDataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/**/*Mapper.xml"));
        final org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        bean.setConfiguration(configuration);
        return bean.getObject();
    }

    /**
     * @name 配置声明事务管理器
     * @description 配置声明事务管理器
     * @time 创建时间:2018年12月16日上午9:53:17
     * @param dynamicDataSource dataSource
     * @return PlatformTransactionManager
     * @history 修订历史（历次修订内容、修订人、修订时间等）
     */
    @Bean(name = "oracleTransactionManager")
    public PlatformTransactionManager oracleTransactionManager(@Qualifier("dynamicDataSource") DynamicDataSource dynamicDataSource) {
        return new DataSourceTransactionManager(dynamicDataSource);
    }

    /**
     * @name 创建SqlSessionTemplate(MyBatis-Spring的核心)
     * @description 创建SqlSessionTemplate(MyBatis-Spring的核心)
     * @time 创建时间:2018年12月16日上午9:54:13
     * @param sqlSessionFactory sqlSessionFactory
     * @return SqlSessionTemplate
     * @history 修订历史（历次修订内容、修订人、修订时间等）
     */
    @Bean(name = "oracleSqlSessionTemplate")
    public SqlSessionTemplate oracleSqlSessionTemplate(@Qualifier("oracleSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
